package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

type Manager struct {
	Title string `json:"title"`
	User
}

/*
在结构体的反射中，我们经常使用 reflect.TypeOf 获取类型信息，然后使用 Type.Field 或 Type.FieldByName()
获取结构体字段的 reflect.StructField，然后根据 StructField 中的信息做进一步处理。
例如，可以通过 StructField.Tag.Get 方法获取结构体字段的标签值。
*/
func main() {
	m := Manager{Title: "Manager", User: User{Name: "Alice", Age: 25}}

	mt := reflect.TypeOf(m)

	// 获取 User 字段的 reflect.StructField
	userField, _ := mt.FieldByName("User")
	fmt.Println("Field 'User' exists:", userField.Name, userField.Type)

	// 获取 User.Name 字段的 reflect.StructField
	nameField, _ := userField.Type.FieldByName("Name")
	tag := nameField.Tag.Get("json")
	fmt.Println("User.Name tag:", tag)
}
